﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SIMA.Mvvm.Base;
using SIMA.Entities;
using SIMA.Core.Security;
using SIMA.Core.Data.Collection;
using SIMA.Core.Extension;
using SIMA.Core.Data.Access;
using SIMA.Controls;
using SIMA.Core.Exceptions;
using SIMA.Core.EventArgs;
//using SIMA.Interfaces;

namespace SIMA.Mvvm
{
    public class MvvmPrincipal:ViewModelBase
    {
        #region Consts

        #endregion

        #region Fields

        private T_C_Usuario usuario;
        private T_C_Perfil perfil;
        private Profile profile;

        private List<T_C_PermisosXPerfil> listaPermisos;
        private List<T_C_Permiso> permisos;
        
        private SmartContainer<T_C_Usuario> usuarioSmart;
        private SmartContainer<T_C_Perfil> perfilSmart;
        private bool isSessionActive;
        private Dictionary<string, T_C_Permiso> permisosAsignados;

        #endregion

        #region Properties

        public T_C_Usuario Usuario
        {
            get
            {
                return usuario;
            }
            set
            {
                usuario = value;
                this.OnPropertyChanged("Usuario");
            }
        }
        public T_C_Perfil Perfil
        {
            get
            {
                return perfil;
            }
            set
            {
                perfil = value;
                this.OnPropertyChanged("Perfil");
            }
        }
        public bool IsSessionActive
        {
            get
            {
                return isSessionActive;
            }
            set
            {
                isSessionActive = value;
                this.OnPropertyChanged("IsSessionActive");
            }
        }
        public Dictionary<string, T_C_Permiso> PermisosAsignados
        {
            get
            {
                return permisosAsignados;
            }
            set
            {
                permisosAsignados = value;
                this.OnPropertyChanged("PermisosAsignados");
            }
        }

        #endregion

        #region Events

        public event EventHandler<ValidationEventArgs> SessionInit;

        #endregion

        #region Constructor

        public MvvmPrincipal()
            : base()
        {
            Init();
        }

        #endregion

        #region Private Methods
        
        private void Init()
        {
            profile = new Profile();
            usuarioSmart = new SmartContainer<T_C_Usuario>();
            perfilSmart = new SmartContainer<T_C_Perfil>();
            usuario = new T_C_Usuario();
            perfil = new T_C_Perfil();
        }

        #endregion

        #region Public Methods

        public void Validate()
        {
            try
            {
                if (IsSessionActive)
                {
                    throw new ActiveSessionException();
                }
                else
                {
                    T_C_Usuario tmpUsuario = Usuario.Clone();
                    StringBuilder strBuilder = new StringBuilder();
                    strBuilder.Append("Id_Usuario = ");
                    strBuilder.Append(tmpUsuario.Id_Usuario);
                    tmpUsuario = usuarioSmart[strBuilder.ToString(), SIMA.Core.Enums.CommandType.CommandText].First();
                    if (Usuario.Contraseña == tmpUsuario.Contraseña.Decrypt())
                    {
                        strBuilder.Remove(0, strBuilder.Length);
                        strBuilder.Append(tmpUsuario.Nombres);
                        strBuilder.Append(" ");
                        strBuilder.Append(tmpUsuario.Apellidos);
                        profile.UserName = strBuilder.ToString().Trim();
                        profile.SessionInit = DateTime.Now;

                        SecurityProgram.PcProfile = profile;

                        strBuilder.Remove(0, strBuilder.Length);
                        strBuilder.Append("Id_Perfil = ");
                        strBuilder.Append(tmpUsuario.Id_Perfil.ToString());

                        Perfil = perfilSmart[strBuilder.ToString(), SIMA.Core.Enums.CommandType.CommandText].First();

                        strBuilder.Remove(0, strBuilder.Length);
                        if (SessionInit != null)
                        {
                            SessionInit(this, new ValidationEventArgs(tmpUsuario));
                        }
                    }
                    else
                    {
                        throw new InvalidCredentialsException();
                    }
                }
            }
            catch (ActiveSessionException ex)
            {
                SIMAMessageBox.Show(DateTime.Now.ToShortTimeString(), ex.Message, ex.StackTrace, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Error);
            }
            catch (InvalidCredentialsException ex)
            {
                SIMAMessageBox.Show(DateTime.Now.ToShortTimeString(), ex.Message, ex.StackTrace, SIMAMessageBoxButtons.OK, SIMAMessageBoxImage.Error);
            }
        }

        #endregion

        #region Destructor

        ~MvvmPrincipal()
        {
            this.Dispose();
        }

        #endregion

        

    }
}
